#pragma once
#include"hashtable.h"
using namespace HashBucket;

namespace My_unordered_set
{
	template<class K>
	struct SetKeyOfT
	{
		const K& operator()(const K& val)
		{
			return val;
		}

	};

	template<class K, class Hash = HashFunc<K>>
	class MySet
	{
	public:

		typedef typename::HashBucket::MY_HashBucket<K, K, SetKeyOfT<K>, Hash>::const_iterator iterator;
		typedef typename::HashBucket::MY_HashBucket<K, K, SetKeyOfT<K>, Hash>::const_iterator const_iterator;
		//iterator()
		iterator begin()
		{
			return ht.begin();
		}

		iterator end()
		{
			return ht.end();
		}

		const_iterator begin() const 
		{
			return ht.begin();
		}

		const_iterator end() const 
		{
			return ht.end();
		}

		const pair<iterator, bool>& insert(const K& kv)
		{
			return ht.insert(kv);
		}

		iterator Find(const K& key) 
		{
			return ht.Find(key);
		}

	private:
		MY_HashBucket<K, K, SetKeyOfT<K>, Hash> ht;
	};


	void test_set()
	{
		My_unordered_set::MySet<int> st;
		st.insert(155);
		st.insert(67);
		st.insert(11);
		st.insert(452);
		st.insert(885);
		st.insert(95);
		st.insert(56);
		st.insert(88);
		st.insert(53);
		st.insert(51);
		st.insert(52);
		auto it = st.begin();
		while (it != st.end()) 
		{
			cout << *it << " ";
			++it;
		}


	}

}
